import axios from "axios";
import { MessageBox, Indicator } from "mint-ui";
import global_ from "../global.config";
import Cookies from "js-cookie";

const codeMessage = {
  // 200: "服务器成功返回请求的数据。",      
  201: "新建或修改数据成功。",
  202: "一个请求已经进入后台排队（异步任务）。",
  204: "删除数据成功。",
  400: "发出的请求有错误，服务器没有进行新建或修改数据的操作。",
  401: "用户没有权限（令牌、用户名、密码错误）。",
  403: "用户得到授权，但是访问是被禁止的。",
  404: "发出的请求针对的是不存在的记录，服务器没有进行操作。",
  406: "请求的格式不可得。",
  410: "请求的资源被永久删除，且不会再得到的。",
  422: "当创建一个对象时，发生一个验证错误。",
  500: "服务器发生错误，请检查服务器。",
  502: "网关错误。",
  503: "服务不可用，服务器暂时过载或维护。",
  504: "网关超时。"
};

let cancel;
// promiseArr = {};
const CancelToken = axios.CancelToken;
//请求拦截器
axios.interceptors.request.use(
  config => {
    //发起请求时，取消掉当前正在进行的相同请求
    // if (promiseArr[config.url]) {
    //   promiseArr[config.url]("操作取消");
    //   promiseArr[config.url] = cancel;
    // } else {
    //   promiseArr[config.url] = cancel;
    // }
    if (config.params && (config.params.action || config.params.requestParam)) {
      let params = {
        j: JSON.stringify({
          openid: Cookies.get("openid") || "",
          passport: Cookies.get("passport") || "",
          vericode: Cookies.get("vericode") || "",
          url: location.href,
          action: config.params.action,
          requestParam: config.params.requestParam || {}
        }),
        t: Math.ceil(Math.random() * 1000)
      };
      config.params = params;
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

//响应拦截器即异常处理
axios.interceptors.response.use(
  response => {
    // if (response.data.code !== 0) {
    //   MessageBox("提示", response.data.errmsg || response.data.msg ||response.data.code);
    if (response.data.code !== 0 && response.config.needDealEx && response.data.code !== 997) {
      MessageBox("提示", response.data.errmsg || response.data.msg || response.data.code);
      // return Promise.resolve(response.data);
      return Promise.reject(response.data);
    }
    global_.paramKeys.forEach(name => {
      if (name in response.data) {
        Cookies.set(name, response.data[name], { expires: 30 });
      }
    });
    return response.data;
  },
  err => {
    if (err && err.response) {
      err.message =
        codeMessage[err.response.status] || `连接错误${err.response.status}`;
    } else {
      err.message = "连接到服务器失败";
    }
    MessageBox("提示", err.message);
    // return Promise.resolve(err.response);
    return Promise.reject(err.response);
  }
);

// axios.defaults.baseURL = global_.API_URL;
// //设置默认请求头
// axios.defaults.headers = {
//   "X-Requested-With": "XMLHttpRequest"
// };

// axios.defaults.headers = {
//   "Content-Type": "text/plain"
// };
// axios.defaults.headers = {
//   "Content-Type": "application/json"
// };

//天津吉宝活动的请求 需要的参数 
axios.defaults.headers = {
  "Content-Type": "application/json",
  // "openid": Cookies.get("openid") || "",
  // "actCode": 'test20190513',//tjkeppel测试
  // "actCode":"tjKepple20190520",//tjkeppel生产
};

axios.defaults.timeout = 10000;

export default {
  //get请求
  get(url, param, option) {
    if (option && option.mask) {
      Indicator.open();
    }
    return new Promise((resolve, reject) => {
      axios({
        method: "get",
        url,
        needDealEx:option&&option.needDealEx!=null&&option.needDealEx!=undefined ?option.needDealEx:true,//新加的
        params: param,
        cancelToken: new CancelToken(c => {
          cancel = c;
        })
      })
        .then(res => {
          if (option && option.mask) {
            Indicator.close();
          }
          resolve(res);
        })
        .catch(function (error) {
          Indicator.close();
        });
    });
  },
  //post请求
  post(url, param, option) {
    if (option && option.mask) {
      Indicator.open();
    }
    return new Promise((resolve, reject) => {
      axios({
        method: "post",
        url,
        needDealEx:option&&option.needDealEx!=null&&option.needDealEx!=undefined ?option.needDealEx:true,//新加的
        data: param,
        cancelToken: new CancelToken(c => {
          cancel = c;
        })
      })
        .then(res => {
          if (option && option.mask) {
            Indicator.close();
          }
          resolve(res);
        })
        .catch(function (error) {
          Indicator.close();
        });
    });
  }
};
